Linux进程加载过程以及内存分析

本文深入探讨Linux进程的加载过程,从fork()到execve(),详细阐述了load_elf_binary()如何处理ELF文件。接着,分析了进程内存,特别是ELF文件的段映射,包括LOAD、INTERP、DYNAMIC等段的作用,以及内存分配策略,如内核空间与用户空间的划分,kmalloc()和vmalloc()的使用。
摘要由CSDN通过智能技术生成

进程加载过程以及Linux进程内存分析

1、进程加载分析

进程的加载过程从bash调用fork()系统调用创建一个新进程开始,新进程调用execve()系统调用执行指定的ELF文件,在执行execve()后,内核就开始了真正的装载过程,execvp()系统调用对应的入口是sys_execve(),在sys_execve()进行了一些参数的检查复制后,调用do_execve(),之后do_execve()会找到指定的ELF文件,读取前128个字节用于判断文件的格式和类型,之后调用search_binary_handle()去搜索匹配合适的可执行文件装载处理过程,search_binary_handle()通过ELF文件的魔数确定文件的格式,调用相应的装载处理方式,ELF的装载处理过程称为load_elf_binary(),a.out的叫load_aout_binary(),装载可执行脚本的叫做load_script()。这里介绍load_elf_binary()。

load_elf_binary()过程如下:

  1. 检查ELF文件格式的有效性,如魔数,段的数量
  2. 寻找动态链接的.interp段,设置动态链接路径。
  3. 根据ELF可执行文件的描述,对ELF文件进行映射,如代码,数据,只读数据。
  4. 初始化ELF进程环境,比如进程启动是的edx寄存器的地址应该是DT_FINI的地址
  5. 将系统调用的返回地址修改为ELF可执行文件的入口点,对于ELF可执行文件,入口点就是e_entry指向的地址,动态链接的ELF文件的入口点是动态链接器。

当load_elf_binary()执行完后,返回至do_execve(),再返回到sys_execve()时,第五步已经把系统调用的返回地址改成了被装在的ELF程序的入口地址了。所以当sys_execve()系统调用从内核态返回到用户态是,eip寄存器就直接跳转到ELF程序的入口地址了,新的程序开始执行,ELF文件装载完毕。

2、进程内存分析

对与ELF文件的映射,涉及到内存的问题,着重分析一下。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值